package com.xiongjie.circuitBreaker;

import io.vertx.circuitbreaker.CircuitBreaker;
import io.vertx.circuitbreaker.CircuitBreakerOptions;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.json.JsonObject;

/**
 * 熔断器的使用
 */
public class CircuitBreakerVertx extends AbstractVerticle {

    @Override
    public void start(){
        CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
                new CircuitBreakerOptions()
                        .setMaxFailures(5) //最大失败次数，超过则打开熔断器
                        .setTimeout(2000) //设置失败超时时间
                        .setFallbackOnFailure(true) //是否回调
                        .setResetTimeout(10000) // 打开熔断器后再次尝试的时间
        );
        breaker.execute(future -> {
            JsonObject data=new JsonObject();
//                    .put("key","value");

            //角度：这里应该是发送请求的一方
            if(data.isEmpty()){
                future.fail("模拟请求请求失败。");
            }else{
                future.complete(data);
            }
        }).setHandler(ar -> {
            if(ar.succeeded()){
                System.out.println("正常操作的结果："+ar.result());
            }else{
                System.out.println("模拟熔断操作:"+ar.cause());
            }
        });
    }
}
